(function($, doc, loc){    
    /**
     * 默认页面配置. 
     */
    var _defaultConfig = {
        disableContextmenu : false,
        disableSelection : false
    };

    /**
     * page是一个单体. 
     */
    var page = {        
        body : doc.body,        
        location : loc,     
        //默认事件管理器.
        em : new ujs.evt.EventManager(),        
        /**
         * page 初始化. 
         * @param {Object} config
         */
        init : function(config){
            var _this = this;
            this.config = $.extend({}, _defaultConfig, config);            
            //页面事件处理
            this.fire('init');            
            $(function(){ _this.fire('ready'); });            
            $(window).load(function () { _this.fire('load'); });   
            //标题         
            this.setTitle(this.config['title']);
            //禁用菜单.
            if(this.config['disableContextmenu']){
                this.disableContextmenu();
            }          
            //禁止选择文本  
            if(this.config['disableSelection']){
                this.disableSelection();
            }            
        },
        /**
         * 设置页面标题.
         * @param {String} pageTitle
         */
        setTitle : function(pageTitle){
            if(pageTitle){
                doc.title = pageTitle;
            }
        },         
        /**
         * 禁用指定元素的右键菜单.
         * @param {Element} contextElement
         */
        disableContextmenu : function(contextElement){
            var action = function(){
                $(contextElement || doc.body).bind('contextmenu', false);    
            }; 
            if(this.body){
                action();
            } else {
                $.onReady(function(){
                    action();
                });
            }
        },         
        /**
         * 禁用浏览器默认的文本选择功能. 
         * @param {Element} contextElement
         */
        disableSelection : function(contextElement){            
            var action = function(){
                $(contextElement || doc.body)
                    .attr('unselectable','on')
                    .css({
                        '-moz-user-select':'-moz-none',
                        '-moz-user-select':'none',             
                        '-webkit-user-select':'none',
                        '-ms-user-select':'none',
                        'user-select':'none'
                    })
                    .bind('selectstart', false);
            };
            if(this.body){
                action();
            } else {
                $.onReady(function(){
                    action();
                });
            }
        },        
        /**
         * 显示全页遮罩层.
         * @param {String} msg
         * @param {String} theme
         */
        showMask : function(msg, theme){
            ujs.ui.paneMask.show(this.body, msg, theme);
        },                
        hideMask : function(){
            ujs.ui.paneMask.hide(this.body);
        },        
        isMasked : function(){
            return ujs.ui.paneMask.isMasked(this.body);
        }
    };    
    
    //启用监听器.
    Observable.enable(page);    
    
    //当ujs包在body元素之前引用时，会导致page.body为null.
    if(!page.body){        
        $.onReady(function(){
            page.body = doc.body;
        });
    }    
     
    //自定义page.isActive
    (function(){
        var inactiveTimer = null,
            inactiveCycle = 5 * 60 * 1000;  //5minute
            
        function setPageActiveState(isActive){
            if(page.isActive === isActive){
                return;
            }
            //console.log('Page is {0}active.'.format(!isActive ? 'in' : ''));            
            page.fire('activeStateChange', isActive);        
            page.isActive = isActive;
            if(isActive){
                $(page.body).removeClass('blur');
            }else {
                $(page.body).addClass('blur');
            }            
            if(inactiveTimer){
                window.clearTimeout(inactiveTimer);
            }
            if(isActive){
                inactiveTimer = (function(){
                    setPageActiveState(false);
                }).defer(inactiveCycle);
            }
        } 
        $(window).load(function(){
            setPageActiveState(true);    
        });            
        doc.addEventListener('visibilitychange', function(e) {
            setPageActiveState(!doc.hidden);
        }, false);
        //注:当与页面内部iframe切换时，或与开发者工具条切换时，均会触发blur与focus事件。
        $(window).blur(function(e){ 
            setPageActiveState(false);        
        }).focus(function(e){
            setPageActiveState(true);
        }).mousemove(function(e){
            if(!page.isActive){
                setPageActiveState(true);
            }
        }).keyup(function(){
            if(!page.isActive){
                setPageActiveState(true);
            }
        });
    })();
    

    //--------------------------------------------------------------------------------------------------------------
    //TODO 老版本兼容性代码，新项目中去掉.
    window.page = page;
        
    ujs.define('page', 'ujs.browser', function(){
        return page;
    });
})(jQuery, document, location);